package br.com.ava.core.produto;

import java.util.List;

import org.apache.commons.lang.StringUtils;
import org.springframework.transaction.annotation.Isolation;
import org.springframework.transaction.annotation.Transactional;

import br.com.ava.core.ConstantesMensagens;
import br.com.ava.core.infra.excecao.NegocioException;
import br.com.ava.core.infra.mensagem.Mensagem;
import br.com.ava.core.infra.persistencia.AbstractMediator;

public class ProdutoMediator extends AbstractMediator<Produto> {

	private static final long serialVersionUID = 1L;
	private ProdutoDAO dao;

	@Override
	protected void validarInclusao(Produto produto) throws NegocioException {
		super.validarInclusao(produto);
		validarCamposObrigatorios(produto);
	}

	@Override
	protected void validarAlteracao(Produto produto) throws NegocioException {
		super.validarAlteracao(produto);

		if (StringUtils.isEmpty(produto.getNome())) {
			produto.setNome(null);
		}
		validarCamposObrigatorios(produto);
	}

	private void validarCamposObrigatorios(Produto produto) {
		List<Mensagem> mensagens = produto.validar();

		if (produto.getAno() == 0) {
			mensagens.add(new Mensagem(
					ConstantesMensagens.MSG_ERRO_CAMPO_OBRIGATORIO, "Ano"));
		}

		if (produto.getEdicao() == 0) {
			mensagens.add(new Mensagem(
					ConstantesMensagens.MSG_ERRO_CAMPO_OBRIGATORIO, "Edição"));
		}

		if (produto.getNpaginas() == 0) {
			mensagens.add(new Mensagem(
					ConstantesMensagens.MSG_ERRO_CAMPO_OBRIGATORIO,
					"Número de Páginas"));
		}

		if (produto.getQuantestoque() == 0) {
			mensagens.add(new Mensagem(
					ConstantesMensagens.MSG_ERRO_CAMPO_OBRIGATORIO,
					"Quantidade em Estoque"));
		}

		if (produto.getValorvenda() == 0) {
			mensagens.add(new Mensagem(
					ConstantesMensagens.MSG_ERRO_CAMPO_OBRIGATORIO,
					"Valor de Venda"));
		}

		if (produto.getNome() != null && StringUtils.isBlank(produto.getNome())) {
			mensagens.add(new Mensagem(
					ConstantesMensagens.MSG_ERRO_CAMPO_OBRIGATORIO, "Nome"));
		}

		if (produto.getAutores() != null
				&& StringUtils.isBlank(produto.getAutores())) {
			mensagens.add(new Mensagem(
					ConstantesMensagens.MSG_ERRO_CAMPO_OBRIGATORIO, "Autores"));
		}

		if (produto.getIsbn() != null && StringUtils.isBlank(produto.getIsbn())) {
			mensagens.add(new Mensagem(
					ConstantesMensagens.MSG_ERRO_CAMPO_OBRIGATORIO, "ISBN"));
		}

		if (produto.getAno() > 0
				&& String.valueOf(produto.getAno()).length() != 4) {
			mensagens.add(new Mensagem(
					ConstantesMensagens.MSG_ERRO_CAMPO_ANO_4_DIGITOS));
		}

		if (!mensagens.isEmpty()) {
			throw new NegocioException(mensagens);
		}
	}

	@Override
	public ProdutoDAO getDao() {
		return dao;
	}

	public void setDao(ProdutoDAO dao) {
		this.dao = dao;
	}

	public List<Produto> consultarTodos() {
		return dao.listar();
	}

	@Transactional(isolation = Isolation.DEFAULT, rollbackFor = Exception.class)
	public void excluirPorId(Integer idProduto) {

		if (idProduto == null) {
			throw new NegocioException(
					ConstantesMensagens.MSG_ERRO_CAMPO_OBRIGATORIO,
					"Id do Produto");
		}

		Produto produto = dao.buscar(idProduto);

		if (produto == null) {
			throw new NegocioException(
					ConstantesMensagens.MSG_ERRO_ENTIDADE_NAO_CADASTRADA,
					"Produto");
		} else {
			dao.excluir(produto);
		}

	}

	@Transactional(isolation = Isolation.DEFAULT, rollbackFor = Exception.class)
	public Produto buscar(Integer idProduto) {
		return dao.buscar(idProduto);
	}

	@Transactional(isolation = Isolation.DEFAULT, rollbackFor = Exception.class)
	public List<Produto> consultarPorNome(String nome) {

		List<Produto> retorno;

		if (StringUtils.isNotBlank(nome)) {
			retorno = dao.buscarPorNome(nome);
		} else {
			retorno = dao.listar();
		}
		return retorno;
	}

}
